package com.cloud.bssp.thread;

import java.util.concurrent.CountDownLatch;

/**
 * @description： 缓存行,在cpu的多级缓存当中，会采用局部性原理，当从主内存加载数据到线程高速缓存时，业界经验会加载64字节（刚好8个long）的数据回来
 * 我们采用如下代码模拟，当对象T只有一个属性x时，时间在3800ms左右。当我们在x前后各增加7个Long（8个字节）占用时，时间是1500ms左右。
 *
 * 当只有一个x时，两次修改x可能在同一个缓存行，需要不停的通知其他线程修改x值，效率低。
 * 而当前后各增加7个的时候，保证两次修改x不可能在同一个缓存行，各自的x互不影响，不需要相互通知，效率高。
 * @author：weirx
 * @date：2021/5/19 15:47
 * @version：3.0
 */
public class CacheRow {

    static long n = 100000000L;

    static class T {
        long p1, p2, p3, p4, p5, p6, p7;
        volatile long x = 0L;
        long p9, p10, p11, p12, p13, p14, p15;
    }

    static T[] arr = new T[2];

    static {
        arr[0] = new T();
        arr[1] = new T();
    }


    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(2);
        new Thread(() -> {
            for (Long i = 0L; i < n; i++) {
                arr[0].x = i;
            }
            countDownLatch.countDown();
        }).start();

        new Thread(() -> {
            for (Long i = 0L; i < n; i++) {
                arr[1].x = i;
            }
            countDownLatch.countDown();
        }).start();

        long startTime = System.currentTimeMillis();
        countDownLatch.await();
        long endTime = System.currentTimeMillis();

        System.out.println(endTime - startTime);
    }
}
